#include "stdbool.h"
#include "config.h"
#include "stmflash.h"
#include "atkp.h"
#include "PID.h"
//usb底层驱动相关
#include "usb_lib.h"
#include "hw_config.h"
#include "usb_pwr.h"
/* FreeRtos includes */
#include "FreeRTOS.h"
#include "task.h"
/********************************************************************************	 
 * 配置参数驱动代码	
********************************************************************************/
configParam_t configParam;/*配置参数全局变量*/

static configParam_t configParamDefault=
{
	.version     = VERSION,			/*版本(3位,一位主版本，两小位子版本)*/
	._pMotorConfig.fVoltagePowerSupply = 12,
    ._pMotorConfig.iSensorDirection = UNKNOWN,
    ._pMotorConfig.ucVoltageAlign = 3,
    ._pMotorConfig.uiPolePairs = 11,
    ._pMotorConfig.fVoltageLimit = 3,
    .bIsInit = false,
};

/* 计算校验值 */
u8 calculate_cksum(configParam_t* data)
{ 
	u8 cksum=0;	
	u8* c = (u8*)data;
    
	for (int i=0; i<sizeof(configParam_t); i++)
		cksum += *(c++);
	cksum -= data->cksum;
	
	return cksum;
}

/*配置参数初始化*/
void configParamInit(void)
{
	static bool isConfigParamOK;
	STMFLASH_Read(CONFIG_PARAM_ADDR,(u16*)&configParam,sizeof(configParam)/2);
	
	if(configParam.version == VERSION)/*版本正确*/
	{
		u8 cksum = calculate_cksum(&configParam);
		if(cksum == configParam.cksum)/*校验正确,把系统参数保存到本地*/
		{
			isConfigParamOK = true;
		}
		else
		{
			isConfigParamOK = false;
		}
	}
	else/*版本更新*/
	{
		isConfigParamOK = false;
	}
	/* 配置参数错误，写入默认参数 */
	if(isConfigParamOK == false)	
	{
		resetConfigParam();
		isConfigParamOK=true;
	}
}

/*配置参数任务*/
void configParamTask(void* param)
{
	u8 cksum = 0;
	while(1) 
	{
		vTaskDelay(1000);
		cksum = calculate_cksum(&configParam);
		if(configParam.cksum != cksum)	
		{
			configParam.cksum = cksum;
            STMFLASH_Write(CONFIG_PARAM_ADDR,(u16*)&configParam,sizeof(configParam)/2);
            
  		}
	}
}

/*保存配置参数*/
void writeConfigParamToFlash(void)
{
	u8 cksum = calculate_cksum(&configParam);
	configParam.cksum = cksum;
	STMFLASH_Write(CONFIG_PARAM_ADDR,(u16*)&configParam,sizeof(configParam)/2);
}

//配置参数复位为默认
void resetConfigParam(void)
{
	configParam = configParamDefault;
	writeConfigParamToFlash();
}







